// 题1
function Test1() {
  (function () {
    var x = (y = 1);
  })();
  var z;
  console.log(y);
  console.log(z);
  console.log(x);
}
// Test1()
// 结果：
// 1
// undefined
// Uncaught ReferenceError:x is not defined
/**
 * 解析：
 *  var x= y = 1，实际上是从右往左执行的，y=1，没有var声明，所以是全局变量
 * x是局部变量
 */

// 题2
function Test2() {
  var a, b;
  (function () {
    console.log(a);
    console.log(b);
    var a = (b = 3);
    console.log(a);
    console.log(b);
  })();
  console.log(a);
  console.log(b);
}
// Test2()
// 结果：
// undefined
// undefined
// 3
// 3
// undefined
// 3
/**
 * 解析：
 *
 */

// 题3
function Test3() {
  var friendName = "World";
  (function () {
    if (typeof friendName === "undefined") {
      var friendName = "Jack";
      console.log("Goodbye " + friendName);
    } else {
      console.log("Hello " + friendName);
    }
  })();
}
// Test3();
// 结果：
//
/**
 * 解析：变量提升
 *
 */

// 题4
function Test4() {
  function fn1() {
    console.log("fn1");
  }
  var fn2;
  fn1();
  fn2();
  fn2 = function () {
    console.log("fn2");
  };
  fn2();
}
// Test4()
// 结果：
// fn1
// Uncaught TypeError: fn2 is not a function

/**
 * 解析：
 *
 */

// 题5
function Test5() {
  function fn1() {
    console.log("fn1");
  }
  fn1();
  fn2();
  function fn2() {
    console.log("fn2");
  }
  fn2();
}
// Test5()
// 结果：
// fn1
// fn2
// fn2

/**
 * 解析：
 *
 */

// 题6
function Test6() {
  function a() {
    var temp = 10;
    function b() {
      console.log(temp);
    }
    b();
  }
  a();
  function a() {
    var temp = 10;
    b();
  }
  function b() {
    console.log(temp); // 此处报错
  }
  a();
}
// Test6()
// 结果：
// Uncaught ReferenceError: temp is not defined
/**
 * 解析：
 *
 */

// 题7
function Test7() {
  var a = 3;
  function c() {
    alert(a);
  }
  (function () {
    var a = 4;
    c();
  })();
}
// Test7()
// 结果：
// 弹出显示 3
/**
 * 解析：
 * js的变量的作用域和定义时的环境有关，与执行时无关
 */

// 题8
function Test8() {
  function fun(n, o) {
    console.log(o);
    return {
      fun: function (m) {
        return fun(m, n);
      },
    };
  }
  var a = fun(0); // undefined
  a.fun(1); // 0
  a.fun(2); // 0
  a.fun(3); // 0

  var b = fun(0).fun(1).fun(2).fun(3);

  // undefined
  // 0
  // 1
  // 2

  var c = fun(0).fun(1);
  c.fun(2);
  c.fun(3);
  // undefined
  // 0
  // 1
  // 1
}
// Test8()
// 结果：
//
/**
 * 解析：
 *
 */

// 题9
g = function () {
  return false;
};
f = function () {
  return true;
};

function Test9() {
  (function () {
    if (window.g() && [] == ![]) {
      f = function () {
        return false;
      };
      function g() {
        return true;
      }
    }
  })();
  console.log(f());
}
Test9();
// 结果：true
//
/**
 * 解析：
 *
 */
